package com.dl698.parse;

import com.dl698.axdr.*;
import com.dl698.bean.FrameData;
import com.dl698.util.DataUtils;
import com.dl698.tools.ResultCode;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

/**
 * ParseGetResponse类
 * 实现获取响应解析功能
 * 
 * @author wind
 * @version 1.1.1
 */
public class ParseGetResponse {

    public static String parseGetResponseNormal(Get_Result get_result) {
        FrameData frameData = new FrameData();

        switch (get_result.getChoiceIndex().getValue()) {
            case 0:
                Map<String, Object> dar = new HashMap<>();
                get_result.getDar().encodeAndSave(1000);
                dar.put("dar", DataUtils.bytesToHexString(
                        get_result.getDar().getDataCode(),
                        0,
                        get_result.getDar().getDataCode().length));
                frameData.setData(dar);
                break;
            case 1:
                String value = ParseTools.parseData(get_result.getData());
                frameData.setData(value);
                break;
        }

        frameData.setCode(ResultCode.SUCCESS);
        return frameData.toJsonString();
    }

    public static String parseGetResponseNormalList(SubSeqOfResults subSeqOfResults) {
        FrameData frameData = new FrameData();
        ArrayList<Object> getListData = new ArrayList<>();
        Map<String, Object> getList = new HashMap<>();

        for (int i = 0; i < subSeqOfResults.size(); i++) {
            switch (subSeqOfResults.get(i).getResult().getChoiceIndex().getValue()) {
                case 0:
                    Map<String, Object> dar = new HashMap<>();
                    subSeqOfResults.get(i).getResult().getDar().encodeAndSave(1000);
                    dar.put("dar", DataUtils.bytesToHexString(
                            subSeqOfResults.get(i).getResult().getDar().getDataCode(),
                            0,
                            subSeqOfResults.get(i).getResult().getDar().getDataCode().length));
                    getListData.add(dar);
                    break;
                case 1:
                    String value = ParseTools.parseData(subSeqOfResults.get(i).getResult().getData());
                    getListData.add(value);
                    break;
            }
        }

        getList.put("seq_get_list", getListData);
        frameData.setCode(ResultCode.SUCCESS);
        frameData.setData(getList);
        return frameData.toJsonString();
    }

    public static String parseGetResponseRecord(SubChoiceRespData subChoice_response) {
        FrameData frameData = new FrameData();

        switch (subChoice_response.getChoiceIndex().getValue()) {
            case 0:
                Map<String, Object> dar = new HashMap<>();
                subChoice_response.getDar().encodeAndSave(1000);
                dar.put("dar", DataUtils.bytesToHexString(
                        subChoice_response.getDar().getDataCode(),
                        0,
                        subChoice_response.getDar().getDataCode().length));
                frameData.setData(dar);
                break;
            case 1:
                Map<String, Object> seq_of_a_record = new HashMap<>();
                Map<String, Object> a_record = new HashMap<>();
                ArrayList<Object> seq_a_record_list = new ArrayList<>();

                for (int i = 0; i < subChoice_response.getRecords().size(); i++) {
                    Map<String, Object> seq_data = new HashMap<>();
                    ArrayList<String> seq_data_list = new ArrayList<>();

                    for (int j = 0; j < subChoice_response.getRecords().get(i).getData().size(); j++) {
                        String value = ParseTools.parseData(subChoice_response.getRecords().get(i).getData().get(j));
                        seq_data_list.add(value);
                    }

                    a_record.put("a_record", seq_data_list);
                    seq_data.put("seq_of_data", seq_data_list);
                    seq_a_record_list.add(a_record);
                }

                seq_of_a_record.put("seq_of_a_record", seq_a_record_list);
                frameData.setData(seq_of_a_record);
                break;
        }

        frameData.setCode(ResultCode.SUCCESS);
        return frameData.toJsonString();
    }

    public static String parseGetResponseRecordList(SubSeqOfRecordResults results) {
        FrameData frameData = new FrameData();
        ArrayList<Object> getRecordData = new ArrayList<>();
        Map<String, Object> getRecordList = new HashMap<>();

        for (int i = 0; i < results.size(); i++) {
            switch (results.get(i).getRespData().getChoiceIndex().getValue()) {
                case 0:
                    Map<String, Object> dar = new HashMap<>();
                    results.get(i).getRespData().getDar().encodeAndSave(1000);
                    dar.put("dar", DataUtils.bytesToHexString(
                            results.get(i).getRespData().getDar().getDataCode(),
                            0,
                            results.get(i).getRespData().getDar().getDataCode().length));
                    getRecordData.add(dar);
                    break;
                case 1:
                    Map<String, Object> seq_of_a_record = new HashMap<>();
                    Map<String, Object> a_record = new HashMap<>();
                    ArrayList<Object> seq_a_record_list = new ArrayList<>();

                    for (int j = 0; j < results.get(i).getRespData().getRecords().size(); j++) {
                        Map<String, Object> seq_data = new HashMap<>();
                        ArrayList<String> seq_data_list = new ArrayList<>();

                        for (int k = 0; k < results.get(i).getRespData().getRecords().get(j).getData().size(); k++) {
                            String value = ParseTools
                                    .parseData(results.get(i).getRespData().getRecords().get(j).getData().get(k));
                            seq_data_list.add(value);
                        }

                        a_record.put("a_record", seq_data_list);
                        seq_data.put("seq_of_data", seq_data_list);
                        seq_a_record_list.add(a_record);
                    }

                    seq_of_a_record.put("seq_of_a_record", seq_a_record_list);
                    getRecordData.add(seq_of_a_record);
                    break;
            }
        }

        getRecordList.put("seq_get_record_list", getRecordData);
        frameData.setData(getRecordList);
        frameData.setCode(ResultCode.SUCCESS);
        return frameData.toJsonString();
    }

    public static String parseGetResponseNext(SubChoiceFrameResp subChoiceFrameResp) {
        FrameData frameData = new FrameData();

        switch (subChoiceFrameResp.getChoiceIndex().getValue()) {
            case 0:
                Map<String, Object> dar = new HashMap<>();
                subChoiceFrameResp.getDar().encodeAndSave(1000);
                dar.put("dar", DataUtils.bytesToHexString(
                        subChoiceFrameResp.getDar().getDataCode(),
                        0,
                        subChoiceFrameResp.getDar().getDataCode().length));
                frameData.setCode(ResultCode.SUCCESS);
                frameData.setData(dar);
                break;
            case 1:
                ArrayList<Object> getListData = new ArrayList<>();
                Map<String, Object> getList = new HashMap<>();

                for (int i = 0; i < subChoiceFrameResp.getAttr().size(); i++) {
                    switch (subChoiceFrameResp.getAttr().get(i).getResult().getChoiceIndex().getValue()) {
                        case 0:
                            Map<String, Object> darAttr = new HashMap<>();
                            subChoiceFrameResp.getAttr().get(i).getResult().getDar().encodeAndSave(1000);
                            darAttr.put("dar", DataUtils.bytesToHexString(
                                    subChoiceFrameResp.getAttr().get(i).getResult().getDar().getDataCode(),
                                    0,
                                    subChoiceFrameResp.getAttr().get(i).getResult().getDar().getDataCode().length));
                            getListData.add(darAttr);
                            break;
                        case 1:
                            String value = ParseTools
                                    .parseData(subChoiceFrameResp.getAttr().get(i).getResult().getData());
                            getListData.add(value);
                            break;
                    }
                }

                getList.put("seq_get_list", getListData);
                frameData.setCode(ResultCode.SUCCESS);
                frameData.setData(getList);
                break;
            case 2:
                ArrayList<Object> getRecordData = new ArrayList<>();
                Map<String, Object> getRecordList = new HashMap<>();

                for (int i = 0; i < subChoiceFrameResp.getRecordAttr().size(); i++) {
                    switch (subChoiceFrameResp.getRecordAttr().get(i).getRespData().getChoiceIndex().getValue()) {
                        case 0:
                            Map<String, Object> darRecord = new HashMap<>();
                            subChoiceFrameResp.getRecordAttr().get(i).getRespData().getDar().encodeAndSave(1000);
                            darRecord.put("dar", DataUtils.bytesToHexString(
                                    subChoiceFrameResp.getRecordAttr().get(i).getRespData().getDar().getDataCode(),
                                    0,
                                    subChoiceFrameResp.getRecordAttr().get(i).getRespData().getDar()
                                            .getDataCode().length));
                            getRecordData.add(darRecord);
                            break;
                        case 1:
                            Map<String, Object> seq_of_a_record = new HashMap<>();
                            Map<String, Object> a_record = new HashMap<>();
                            ArrayList<Object> seq_a_record_list = new ArrayList<>();

                            for (int j = 0; j < subChoiceFrameResp.getRecordAttr().get(i).getRespData().getRecords()
                                    .size(); j++) {
                                Map<String, Object> seq_data = new HashMap<>();
                                ArrayList<String> seq_data_list = new ArrayList<>();

                                for (int k = 0; k < subChoiceFrameResp.getRecordAttr().get(i).getRespData().getRecords()
                                        .get(j).getData().size(); k++) {
                                    String value = ParseTools.parseData(subChoiceFrameResp.getRecordAttr().get(i)
                                            .getRespData().getRecords().get(j).getData().get(k));
                                    seq_data_list.add(value);
                                }

                                a_record.put("a_record", seq_data_list);
                                seq_data.put("seq_of_data", seq_data_list);
                                seq_a_record_list.add(a_record);
                            }

                            seq_of_a_record.put("seq_of_a_record", seq_a_record_list);
                            getRecordData.add(seq_of_a_record);
                            break;
                    }
                }

                getRecordList.put("seq_get_record_list", getRecordData);
                frameData.setData(getRecordList);
                frameData.setCode(ResultCode.SUCCESS);
                break;
        }

        return frameData.toJsonString();
    }
}